Jeśli moja strona Ci pomogła, i chcesz aby była bardziej rozwijana, wesprzyj mnie
buy me a coffee
I. Wzorce kreacyjne
II. Wzorce strukturalne
III. Wzorce czynnościowe
|
Most (Bridge) - wzorzec projektowy (design pattern) - java
1. Cel:
Wzorzec projektowy most (bridge) oddziela abstrakcję od jej implementacji, tak aby obie mogły się zmieniać niezależnie.
Adapter działa na starym kodzie, gdzie Bridge jest tworzony podczas projektowania systemu.
Wzorzec ten zmienia z 'is a relation' na 'has a relation'.
2. Problem:
Mamy TV do którego jest przydzielony pilot. Chcemy dodać pilot który będzie działał na każdym telewizorze.
3. Rozwiązanie:
Używamy kompozycji przy tworzeniu pilota przekazując TV, który działa niezależnie od pilota.
Późniejsze zmiany w klasie TV nie wpływają na działanie pilota.
4. Diagram klas wzorca Bridge:

5. Implementacja:
Interface urządzenia:
public interface Device {
boolean isEnabled()
void enable();
void disable();
int getVolume();
void setVolume(int valume);
int getChannel();
void setChannel(int channel);
void printDetails();
}
Implementacja interfejsu urządzenia:
public class Radio implements Device {
private boolean enabled = false;
private int volume = 5;
private int channel = 1;
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void enable() {
enabled = true;
}
@Override
public void disable() {
enable = false;
}
@Override
public int getVolume() {
return volume;
}
@Override
public void setVolume(int volume) {
if (volume > 10) {
this.volume = 10;
} else if (volume < 0) {
this.volume = 0;
} else {
this.volume = volume;
}
}
@Override
public int getChannel() {
return channel;
}
@Override
public void setChannel(int channel) {
if (channel > 100) {
this.volume = 100;
} else if (volume < 0) {
this.channel = 0;
} else {
this.channel = channel;
}
}
@Override
public void printDetails() {
System.out.println("It's radio");
System.out.println("Radio is " + (enabled ? "enabled" : "disabled"));
System.out.println("Radio volume is " + volume + "%");
System.out.println("Radio channel is " + channel);
}
}
public class TV implements Device {
private boolean enabled = false;
private int volume = 5;
private int channel = 1;
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void enable() {
enabled = true;
}
@Override
public void disable() {
enable = false;
}
@Override
public int getVolume() {
return volume;
}
@Override
public void setVolume(int volume) {
if (volume > 10) {
this.volume = 10;
} else if (volume < 0) {
this.volume = 0;
} else {
this.volume = volume;
}
}
@Override
public int getChannel() {
return channel;
}
@Override
public void setChannel(int channel) {
if (channel > 100) {
this.volume = 100;
} else if (volume < 0) {
this.channel = 0;
} else {
this.channel = channel;
}
}
@Override
public void printDetails() {
System.out.println("It's TV");
System.out.println("TV is " + (enabled ? "enabled" : "disabled"));
System.out.println("TV volume is " + volume + "%");
System.out.println("TV channel is " + channel);
}
}
Interface pilota:
public interfaceRemote{
void power();
void ValumeUp();
void VolumeDown();
void channelUp();
void channelDown();
void printDetails();
}
Implementacja pilota:
public class RemoteController implements Remote {
private Device device;
public RemoteController(Device device) {
this.device = device;
}
@Override
public void power() {
if (device.isEnabled()) {
device.disable();
} else {
device.enable();
}
}
@Override
public void volumeUp() {
device.setVolume(device.getVolume() + 1);
}
@Override
public void volumeDown() {
device.setVolume(device.getVolume() - 1);
}
@Override
public void channelUp() {
device.setChannel(device.getChannel() + 1);
}
@Override
public void channelDown() {
device.setChannel(device.getChannel() - 1);
}
@Override
public void printDetails() {
device.printDetails();
}
}
i klasa testująca:
public class RemoteControllerTest {
public static void main(String[] arg) {
System.out.println("Radio Test:");
Remote rc = new RemoteController(new Radio());
rc.power();
rc.channelUp();
rc.channelUp();
rc.channelUp();
rc.volumeUp();
rc.volumeUp();
rc.printDetails();
System.out.println("TV Test:");
Remote rc = new RemoteController(new TV());
rc.power();
rc.channelUp();
rc.volumeDown();
rc.volumeDown();
rc.printDetails();
}
}
Wynikiem programu jest:
Radio Test:
It's radio
Radio is enabled
Radio volume is 7
Radio channel is 4
TV Test:
It's TV
TV is enabled
TV volume is 3
TV channel is 2
6. Zastosowanie w kodzie java:
- AWT - dostarcza abstrakcji która mapuje do native OS okna.
- JDBC
|